package com.example.redis_redisson_demo.web.redisson;

import com.example.redis_redisson_demo.common.utils.R;
import com.example.redis_redisson_demo.dao.AttrDao;
import com.example.redis_redisson_demo.entity.AttrEntity;
import org.redisson.api.RMap;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 介绍redisson提供的分布式集合
 * 即java.util.collection包下的各种接口的分布式实现
 * <p>
 * 注意，当使用到redisson的分布式集合时，目的早已不是redis缓存了，而是分布式业务!!!
 * 就例如秒杀活动，我希望用一个有序列表，记录秒杀开始瞬间从早到晚成功秒杀的用户。
 * 假如我的秒杀模块是分布式集群，在北京上海广州都有服务器，那请问他们之间如何操作同一个有序列表，且保持高迸发性能向其中插入数据？
 * <p>
 * 这就是Redisson分布式集合能做到的。
 * 例如redisson提供的RList，我管你业务是在北京还是上海还是广州，你既然是同一个业务(都是秒杀模块)，
 * 那不管是用redis单点还是集群还是哨兵，相同业务肯定是用相同的redis，那么redisson的配置也就是相同的。
 * 这样只要都是用RedissonClient操作相同名称的RList，redisson保证北京上海广州操作的都是同一个RList，且保证高迸发性能
 */
@RestController
@RequestMapping("/redissondistributedcollection")
public class RedissonDistributedCollectionController {
    @Autowired
    RedissonClient redissonClient;
    @Autowired
    AttrDao attrDao;

    /**
     * 基于Redis的Redisson的分布式映射结构的RMap Java对象实现了java.util.concurrent.ConcurrentMap接口和java.util.Map接口。
     * 与HashMap不同的是，RMap保持了元素的插入顺序。
     * 该对象的最大容量受Redis限制，最大元素数量是4 294 967 295个。
     *
     * 同样大部分分布式集合接口均提供异步实现
     *
     * @return
     */
    @RequestMapping("/map")
    public R redissonMap() {
        String redissonPrefix = "demo:redisson:disCol:";
        AttrEntity attrEntity = attrDao.selectById(2L);

        /**
         * 获取一个指定key名的分布式map，如果redis中已经存在则返回redis中的映射，否则之后的操作将在redis中创建一个指定key名的map
         */
        RMap<Object, Object> map = redissonClient.getMap(redissonPrefix + "map");
        return R.ok();
    }


}
